Implement the in_place tags from p0032r3. That paper also has changes to any/optional but those will be implemented later. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@276537 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/utility b/include/utility index 7b978ad..fd8a7f2 100644 --- a/include/utility +++ b/include/utility
@@ -171,6 +171,20 @@ template<class T, class U=T> T exchange(T& obj, U&& new_value); + +// 20.2.7, in-place construction // C++17 +struct in_place_tag { in_place_tag() = delete; }; // C++17 +using in_place_t = in_place_tag(&)(unspecified ); +template <class T> + using in_place_type_t = in_place_tag(&)(unspecified <T>); +template <size_t I> + using in_place_index_t = in_place_tag(&)(unspecified <I>); +in_place_tag in_place(unspecified ); +template <class T> + in_place_tag in_place(unspecified <T>); +template <size_t I> + in_place_tag in_place(unspecified <I>); + } // std */ @@ -179,6 +193,7 @@ #include <__tuple> #include <type_traits> #include <initializer_list> +#include <__debug> #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) #pragma GCC system_header @@ -782,6 +797,49 @@ } #endif // _LIBCPP_STD_VER > 11 +#if _LIBCPP_STD_VER > 14 + +struct _LIBCPP_TYPE_VIS_ONLY __in_place_tag {}; +template <class> struct _LIBCPP_TYPE_VIS_ONLY __in_place_type_tag {}; +template <size_t> struct _LIBCPP_TYPE_VIS_ONLY __in_place_index_tag {}; + +struct _LIBCPP_TYPE_VIS_ONLY in_place_tag; + +using in_place_t = in_place_tag(&)(__in_place_tag); +template <class _Tp> +using in_place_type_t = in_place_tag(&)(__in_place_type_tag<_Tp>); +template <size_t _Nx> +using in_place_index_t = in_place_tag(&)(__in_place_index_tag<_Nx>); + +struct in_place_tag { + in_place_tag() = delete; +private: + explicit in_place_tag(__in_place_tag) {} + + friend inline in_place_tag in_place(__in_place_tag __t); + template <class _Tp> + friend inline in_place_tag in_place(__in_place_type_tag<_Tp>); + template <size_t _Nx> + friend inline in_place_tag in_place(__in_place_index_tag<_Nx>); +}; + +inline in_place_tag in_place(__in_place_tag __t) { + _LIBCPP_ASSERT(false, "The in_place function cannot be invoked"); + return in_place_tag(__t); +} +template <class _Tp> +inline in_place_tag in_place(__in_place_type_tag<_Tp>) { + _LIBCPP_ASSERT(false, "The in_place function cannot be invoked"); + return in_place_tag(__in_place_tag{}); +} +template <size_t _Nx> +inline in_place_tag in_place(__in_place_index_tag<_Nx>) { + _LIBCPP_ASSERT(false, "The in_place function cannot be invoked"); + return in_place_tag(__in_place_tag{}); +} + +#endif // _LIBCPP_STD_VER > 14 + _LIBCPP_END_NAMESPACE_STD #endif // _LIBCPP_UTILITY